      SUBROUTINE regularizaWL2(X,iflagF,iflagG)	

      !termo de regularizacao: weighted L2 regularizer

      use globais
      implicit none


      integer :: i,j,ndonoh
      integer :: iflagF,iflagG
      double precision ::X(N)

      double precision:: aux
      double precision:: deltan2
      ! dá pra fazer sem montar a matriz.... só somando direto o produto.... 
!       allocate(L(N,N))
!       L = 0.d0 ! zera a matriz
      double precision :: dcdxfc, mapXemC
      do i=1,N
	  CX(i) = mapXemC(X(i),cmin,cmax)
	  CXn(i) = mapXemC(Xn(i),cmin,cmax)
      enddo



      
      if(iflagF.eq.1 )then !calcula  Treg 

	  if(iflagG.eq.1 )then!calcula  gradTreg 
	      do i=1,Nx0*Nz0
		  gradTreg(i) = 0.0d0
	      enddo
	  endif

	  Treg = 0.0d0

	  deltan2 = FXn/(deltaX0*deltaZ0) 


! 	  ! calcula Treg e gradTreg com dif finitas centrais
! 	  do j=2,Nz0-1 
! 	      do i=2,Nx0-1
! 		  Ndonoh = (j-1)*Nx0 + i
! 		  aux  = (CXn(Ndonoh+1)-CXn(Ndonoh-1))**2  + (CXn(Ndonoh+Nx0)-CXn(Ndonoh-Nx0))**2  + deltan2
! 		  Treg = Treg + ((CX(Ndonoh+1)-CX(Ndonoh-1))**2  + (CX(Ndonoh+Nx0)-CX(Ndonoh-Nx0))**2  + deltan2)/aux
! 		  if(iflagG.eq.1 )then!calcula  gradTreg 	
! 		      gradTreg(Ndonoh+1  ) = gradTreg(Ndonoh+1  ) + 2.0*((CX(Ndonoh+1  )-CX(Ndonoh-1)))/aux
! 		      gradTreg(Ndonoh-1  ) = gradTreg(Ndonoh-1  ) - 2.0*((CX(Ndonoh+1  )-CX(Ndonoh-1)))/aux
! 		      gradTreg(Ndonoh+Nx0) = gradTreg(Ndonoh+Nx0) + 2.0*((CX(Ndonoh+Nx0)-CX(Ndonoh-Nx0)))/aux
! 		      gradTreg(Ndonoh-Nx0) = gradTreg(Ndonoh-Nx0) - 2.0*((CX(Ndonoh+Nx0)-CX(Ndonoh-Nx0)))/aux
! 		  endif
! 	      enddo
! 	  enddo
! 	  Treg = Treg/dfloat((nx0-2)*(nz0-2))
! 	  if(iflagG.eq.1 )then!calcula  gradTreg 
! 	      do i=1,Nx0*Nz0
! 		  gradTreg(i) = gradTreg(i)*dcdxfc(CX(i),cmin,cmax)/dfloat((nx0-2)*(nz0-2))
! 	      enddo 
! 	  endif
! 	  ! fim dif finitas centrais


	  ! calcula Treg e gradTreg com dif finitas progressivas
	  do j=1,Nz0-1 
	      do i=1,Nx0-1
		  Ndonoh = (j-1)*Nx0 + i
! 		  aux  = (CXn(Ndonoh+1)-CXn(Ndonoh))**2  + (CXn(Ndonoh+Nx0)-CXn(Ndonoh))**2  + deltan2
! 		  Treg = Treg + ((CX(Ndonoh+1)-CX(Ndonoh))**2  + (CX(Ndonoh+Nx0)-CX(Ndonoh))**2  + deltan2)/aux

		  aux  = (Xn(Ndonoh)-Xn(Ndonoh+1))**2 + (Xn(Ndonoh)-Xn(Ndonoh+Nx0))**2 +  deltan2
		  Treg = Treg + ((X(Ndonoh)-X(Ndonoh+1))**2 + (X(Ndonoh)-X(Ndonoh+Nx0))**2 + deltan2)/aux

! 		  aux  = (Xn(Ndonoh)-Xn(Ndonoh+1))**2 + (Xn(Ndonoh)-Xn(Ndonoh+Nx0))**2 + &
! 			      &	(Xn(Ndonoh)-Xn(Ndonoh-1))**2 + (Xn(Ndonoh)-Xn(Ndonoh-Nx0))**2  + deltan2
! 		  Treg = Treg + ((X(Ndonoh)-X(Ndonoh+1))**2 + (X(Ndonoh)-X(Ndonoh+Nx0))**2 + &
! 			      &	(X(Ndonoh)-X(Ndonoh-1))**2 + (X(Ndonoh)-X(Ndonoh-Nx0))**2  + deltan2)/aux

		  if(iflagG.eq.1 )then!calcula  gradTreg 
! 		      gradTreg(Ndonoh+1  ) = gradTreg(Ndonoh+1  ) + 2.0*((CX(Ndonoh+1  )-CX(Ndonoh)))/aux
! 		      gradTreg(Ndonoh+Nx0) = gradTreg(Ndonoh+Nx0) + 2.0*((CX(Ndonoh+Nx0)-CX(Ndonoh)))/aux
! 		      gradTreg(Ndonoh    ) = gradTreg(Ndonoh    ) - 2.0*((CX(Ndonoh+Nx0)-CX(Ndonoh)))/aux - 2.0*((CX(Ndonoh+1  )-CX(Ndonoh)))/aux
		      gradTreg(Ndonoh+1  ) = gradTreg(Ndonoh+1  ) + 2.0*((X(Ndonoh+1  )-X(Ndonoh)))/aux
		      gradTreg(Ndonoh+Nx0) = gradTreg(Ndonoh+Nx0) + 2.0*((X(Ndonoh+Nx0)-X(Ndonoh)))/aux
		      gradTreg(Ndonoh    ) = gradTreg(Ndonoh    ) - 2.0*((X(Ndonoh+Nx0)-X(Ndonoh)))/aux - 2.0*((X(Ndonoh+1  )-X(Ndonoh)))/aux

! 		      gradTreg(Ndonoh) = gradTreg(Ndonoh) + (2.0*(X(Ndonoh)-X(Ndonoh+1)) + 2.0*(X(Ndonoh)-X(Ndonoh+Nx0)) + &
! 			&	2.0*(X(Ndonoh)-X(Ndonoh-1)) + 2.0*(X(Ndonoh)-X(Ndonoh-Nx0)))
! 		      gradTreg(Ndonoh+1) = gradTreg(Ndonoh+1) - (2.0*(X(Ndonoh)-X(Ndonoh+1)))
! 		      gradTreg(Ndonoh-1) = gradTreg(Ndonoh-1) - (2.0*(X(Ndonoh)-X(Ndonoh-1)))
! 		      gradTreg(Ndonoh+Nx0) = gradTreg(Ndonoh+Nx0) - (2.0*(X(Ndonoh)-X(Ndonoh+Nx0)))
! 		      gradTreg(Ndonoh-Nx0) = gradTreg(Ndonoh-Nx0) - (2.0*(X(Ndonoh)-X(Ndonoh-Nx0)))
		  endif
	      enddo
	  enddo
	  Treg = Treg/dfloat((nx0-1)*(nz0-1))
	  if(iflagG.eq.1 )then!calcula  gradTreg 
	      do i=1,Nx0*Nz0
! 		  gradTreg(i) = gradTreg(i)*dcdxfc(CX(i),cmin,cmax)/dfloat((nx0-1)*(nz0-1))
		  gradTreg(i) = gradTreg(i)/dfloat((nx0-1)*(nz0-1))
	      enddo 
	  endif
	  ! fim dif finitas progressivas



      endif

	

 


      return
      end subroutine